List comprehensions

Jedná se o zápis s Pythonu s jehož pomocí se dají jednoduše vytvářet seznamy.


In [1]:
[x for x in range(10)]


Out[1]:
[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

In [2]:
[x**2 for x in range(10)]


Out[2]:
[0, 1, 4, 9, 16, 25, 36, 49, 64, 81]

In [3]:
[x**2 for x in range(10) if x % 2 == 0]


Out[3]:
[0, 4, 16, 36, 64]

In [4]:
[(x, x**2) for x in range(10)]


Out[4]:
[(0, 0),
 (1, 1),
 (2, 4),
 (3, 9),
 (4, 16),
 (5, 25),
 (6, 36),
 (7, 49),
 (8, 64),
 (9, 81)]

In [5]:
[[y for y in range(3)] for x in range(10)]


Out[5]:
[[0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2],
 [0, 1, 2]]

Tabulka s hracím polem

Řešení 1


In [ ]:
def vytvor_tabulku():
    zap_tabulka = []

    for rada_x in '.', '.', '.', '.', '.', '.', '.', '.', '.', '.':
        radek = []
        for rada_y in '.', '.', '.', '.', '.', '.', '.', '.', '.', '.':
            radek.append(rada_y)
        zap_tabulka.append(radek)
    return zap_tabulka

Řešení 2


In [ ]:
def vytvor_prazdne_herni_pole(r,s):
    seznam_radku = []
    for a in range(r):
        radek = ["."]
        for b in range(s-1):
            radek.append(".")
        seznam_radku.append(radek)
    return seznam_radku

Správné řešení


In [ ]:
def vytvor_tabulku(velikost):
    seznam_radku = []
    for a in range(velikost):
        radek = []
        for b in range(velikost):
            radek.append(".")
        seznam_radku.append(radek)
    return seznam_radku

Krátké řešení (s pomocí list comprehensions)


In [ ]:
def vytvor_tabulku(velikost):
    tabulka = []
    for x in range(velikost):
        radek = ['.' for x in range(velikost)]
        tabulka.append(radek)
    return tabulka

Nejkratší řešení (je nejlepší?)


In [5]:
def vytvor_tabulku(velikost):
    return [list('.' * velikost) for x in range(velikost)]

In [4]:
def vytvor_tabulku(velikost):
    return [['.'] * velikost] * velikost

Je vytvoření kompletní tabulky se všemi hracími políčky vážně potřeba?

Zvířátka

Najdi chyby, nejasnosti či nepřesnosti v tomto kódu:


In [ ]:
zvirata = [ "pes", "kočka", "králík", "had", "ježek"]
znak = "k"

def pismeno(jmeno):
    for i in range(5):
        if znak in jmeno[i][0]:
            print(jmeno[i])
    return

pismeno(zvirata)

Takto by to mohlo vypadat přehlednější a pochopitelnější


In [ ]:
zvirata = [ "pes", "kočka", "králík", "had", "ježek"]

def s_prvnim_pismenem(seznam_zvirat, pismeno):
    for zvire in seznam_zvirat:
        if zvire.startswith(pismeno):
            print(zvire)

s_prvnim_pismenem(zvirata, 'k')

Další podobná funkce:


In [ ]:
def kratke(jmeno = zvirata):
    for i in range(len(jmeno)):
        if len(jmeno[i]) < 5:
            print(jmeno[i])
        else:
            print(end = "")
    return jmeno

kratke(zvirata)

A její přehlednější varianta:


In [ ]:
def kratke(seznam_zvirat):
    for jmeno in seznam_zvirat:
        if len(jmeno) < 5:
            print(jmeno)

kratke(zvirata)

Je možné tuto funkci zkrátit a zjednodušit?


In [ ]:
def overeni(seznam):
    "ověří, zda je zadané slovo v seznamu a vrátí True/False"
    otazka = input("Zadej název zvířete, jež chceš ověřit: ")
    if otazka in seznam:
        return True
    else:
        return False

Ano, je to možné


In [ ]:
def overeni(seznam):
    "ověří, zda je zadané slovo v seznamu a vrátí True/False"
    otazka = input("Zadej název zvířete, jež chceš ověřit: ")
    return otazka in seznam

Had


In [ ]:
from random import randrange


def velikost_hraciho_pole():
    while True:
        odpoved = input('Zadej velikost pole pro hada: ')
        try:
            velikost = int(odpoved)
        except ValueError:
            print('Velikost musí být celé číslo')
        else:
            if velikost < 5:
                print('Pole musí být rozumně veliké')
            break

    return velikost


def vykresli_mapu(velikost, had, ovoce):
    for x in range(velikost):
        for y in range(velikost):
            if (x, y) in had:
                print('X', end=' ')
            elif (x, y) in ovoce:
                print('?', end=' ')
            else:
                print('.', end=' ')
        print()


def posun(velikost, had, ovoce):
    while True:
        smer = input('Zadej smer posunu [s, j, v, z]: ')
        smer = smer.lower().strip()
        if smer not in ('s', 'j', 'v', 'z'):
            print('Nekorektni smer!')
        else:
            break

    hlava = had[-1]
    x, y = hlava
    if smer == 's':
        nova_hlava = x-1, y
    elif smer == 'j':
        nova_hlava = x+1, y
    elif smer == 'v':
        nova_hlava = x, y+1
    elif smer == 'z':
        nova_hlava = x, y-1

    if nova_hlava in had:
        print('Narazil si sam do sebe')
        return False

    x, y = nova_hlava

    if x < 0 or x > velikost-1 or y < 0 or y > velikost-1:
        print('Vyjel si mimo herni pole')
        return False

    if nova_hlava in ovoce:
        ovoce.remove(nova_hlava)
    else:
        del had[0]

    had.append(nova_hlava)
    return True


def pridej_ovoce(velikost, had, ovoce):
    ovoce.append((randrange(0, velikost), randrange(0, velikost)))
    while ovoce[-1] in had:
        del ovoce[-1]
        ovoce.append((randrange(0, velikost), randrange(0, velikost)))


velikost = velikost_hraciho_pole()

had = [(0, 0), (0, 1), (0, 2)]
ovoce = []
pridej_ovoce(velikost, had, ovoce)

vykresli_mapu(velikost, had, ovoce)

while posun(velikost, had, ovoce):
    vykresli_mapu(velikost, had, ovoce)
    if not ovoce:
        pridej_ovoce(velikost, had, ovoce)

Rubber duck problem solving

Jde o techniku řešení problému, při které se svůj problém snažíte vysvětlit někomu (nebo v případě gumové kachny něčemu), kdo programování nemusí vůbec rozumět. Když řešenou problematiku a vaše současné řešení popisujete nahlas, uvědomíte si, co váš program aktuálně dělá a co by dělat měl, což zpravidla vede k vyřešení problému.

Obecné rady a poznatky

Snažte se!!!